package com.probiz.estore.product.service;

import java.math.BigDecimal;
import java.util.List;

import com.probiz.estore.common.model.product.ProductReview;
import com.probiz.estore.core.search.SearchCriteria;
import com.probiz.estore.core.service.GenericManager;
import com.probiz.estore.product.model.ProductReviewSearchCriteria;

/**
 * Manager interface for ProductReview, responsible for business processing, and communicate between web and persistence layer.
 *
 */
public interface ProductReviewManager extends GenericManager<ProductReview> {
	/**
	 * 完全删除函数(评论或者回复)
	 * @param productReview
	 */
	public void deleteFully(ProductReview productReview);
	 /**
	 * 新增回复
	 * @param reply
	 */
	public void addReply(ProductReview reply);
	/**
	 * 新增评论
	 * @param productReview
	 */
	public void addReview(ProductReview productReview);
	
	/**
	 * 获得全部好中差评的个数(可见)
	 * @param productId
	 * @return [0]全部 [1]好评 [2]中评 [3]差评
	 */
	public Integer[] getCountsByScoreLevelAndProductId(Integer productId);
	
	/**
	 * 获得全部一二三四五个星的个数(可见)
	 * @param productId
	 * @return 
	 */
	public Integer[] getCountsByScoreSpanAndProductId(Integer productId);
	/**
	 * 获得“我要评论”，“我发表的评论”，“我回复的评论”，“我认为有用的评论 ”的个数
	 * @param customerId
	 * @return 
	 */
	public Integer[] getCountsOfCustomer(Integer customerId);
	
	/**
	 * 获得搜索criteria
	 * @param productReviewSearchCriteria
	 * @param searchCriteria
	 * @return
	 */
	public SearchCriteria getSearchCriteria(ProductReviewSearchCriteria productReviewSearchCriteria, SearchCriteria searchCriteria);
	/**
	 * 搜索评论
	 * @param productReviewSearchCriteria
	 * @param searchCriteria
	 * @return
	 */
	public List<ProductReview> searchByCriteria(ProductReviewSearchCriteria productReviewSearchCriteria, SearchCriteria searchCriteria);
	
	/**
     * 搜索产品，从GenericController借鉴过来。防止翻页过钱
     *
     * @param productSearchCriteria 自定义搜索条件
     * @param searchCriteria        分页搜索条件
     * @return 搜索结果
     */
    public List<ProductReview> searchByCriteriaForController(ProductReviewSearchCriteria productReviewSearchCriteria, SearchCriteria searchCriteria);
    /**
     * 标识为已阅
     * @param productReview
     */
    public void doMarkRead(ProductReview productReview);
    
    /**
     * 标识为未阅
     * @param productReview
     */
    public void doMarkUnRead(ProductReview productReview);
    
    /**
     * 标识为可见
     * @param productReview
     */
    public void doMarkShow(ProductReview productReview);
    
    /**
     * 标识为不可见
     * @param productReview
     */
    public void doMarkUnShow(ProductReview productReview);
    
    /**
     * 标识为置顶
     * @param productReview
     */
    public void doMarkTop(ProductReview productReview);
    /**
     * 标识为非置顶
     * @param productReview
     */
    public void doMarkUnTop(ProductReview productReview);
    
	
	/**
	 * 更新评论的回复数量
	 * 
	 * @param productReviewId  回复id
	 * @param replyCount  要改变的数量，可正可负
	 * @param onShowReplyCount  要改变的激活数量，可正可负
	 */
	public void updateReviewReplyCount(ProductReview productReview,Integer replyCount, Integer onShowReplyCount);
	
	/**
	 * 更新商品的评论数量和平均分（不传参数，查数据库计算）
	 * 
	 * @param productId  商品id
	 * @param reviewCount  要改变的数量，可正可负
	 * @param onShowReviewCount  要改变的激活数量，可正可负
	 */
	public void updateReviewCountAndScore(Integer productId,Integer reviewCount, Integer onShowReviewCount);
	
	/**
	 * 根据商品id获得评论的平均分
	 * @param productId
	 * @return
	 */
	public BigDecimal getReviewScoreByProductId(Integer productId);
	
	/**
	 * 获得评论的所有可见回复
	 * @param productReviewId
	 * @return
	 */
	public List<ProductReview> getOnShowReplyListByReviewId(Integer productReviewId);
	
	/**
	 * 获得平台总评论数
	 * @return
	 */
	public Long countProductReviewTotal();
	
	/**
	 * 根据商品id和数量获得最先评论的客户id，不考虑评论是否可见
	 * @param productId
	 * @param size
	 * @return
	 */
	public List<Integer> getPreviousCustomerIdListByProductIdBySize(Integer productId,Integer size);
	
	/**
	 * 获得评论的回复个数
	 * @param productReviewId
	 * @return
	 */
	public Long getReplyCountByProductReviewId(Integer productReviewId);
	
	/**
	 * 获得评论可见的回复个数
	 * @param productReviewId
	 * @return
	 */
	public Long getOnShowReplyCountByProductReviewId(Integer productReviewId);
	
	/**
	 * 获得商品的评论个数
	 * @param productId
	 * @return
	 */
	public Long getReviewCountByProductId(Integer productId);
	/**
	 * 获得商品的可见评论个数
	 * @param productId
	 * @return
	 */
	public Long getOnShowReviewCountByProductId(Integer productId);
	
	
}
